package com.cskaoyan.extend.initailize.explicit;

/*
     子类对象的显示初始化

     如何调用调用父类的构造方法呢？ 通过super关键字实现

    super关键字：  super代表父类对象的引用。
    this关键字：  表示当前对象的引用         super关键字：  super代表父类对象的引用。
    this访问 当前对象的成员变量值            super 访问父类对象中，成员变量的值
    this访问 当前对象的成员方法              super 访问父类对象，成员方法
    this 调用 当前类中定义的构造方法         super  调用父类中定义的构造方法
    this(实参列表)                          super(实参列表)

    所以，总结一下，通过super关键子super(实参列表)，调用到父类定义的构造方法。

    如何实现子类对象的显示初始化？
        只需要在子类构造方法的第一条语句，先调用父类的构造方法，在执行子类构造方法的方法体即可
    注意事项：
    1. 必须保证，子类每个构造方法，都要满足子类对象的初始化流程
    2. 在子类构造方法中，通过super调用，父类构造方法时，该super语句，
       必须出现在，子类构造方法第一条语句的位置
    3. this()(调用当前类的构造方法) 和 super()(调用父类的构造方法)都可以，写在构造方法的方法体中, 它们都需要在第一条语句的位置
       它们不能共存
    4. 父类 成员变量初始化语句 构造代码块都，优先于子类中 成员变量的初始化语句，
       构造代码块执行

 */
public class Demo1 {

    public static void main(String[] args) {

        // 创建子类对象
        int sonI = 10;
        int fatherI = 100;
        ExplicitSon explicitSon = new ExplicitSon(sonI, fatherI);
//
//        System.out.println(explicitSon.fatherI);
//
//        System.out.println(explicitSon.sonI);
    }
}

class ExplicitFather {

    int fatherI;

    /*
          父类中定义的构造代码块
     */
    {
        System.out.println("father");
    }

//    public ExplicitFather() {
//        this.fatherI = 100;
//    }

    public ExplicitFather(int fatherI) {
        this.fatherI = fatherI;
    }
}

class ExplicitSon extends ExplicitFather {

    int sonI;

    /*
        子类中定义的构造代码块
     */
    {
        System.out.println("son");
    }

    public ExplicitSon (int sonI, int fatherI) {
        // 先调用父类有参构造方法，必须出现在子类第一条语句的位置
        super(fatherI);
        this.sonI = sonI;
    }

    public ExplicitSon() {
        super(10);
    }


}
